﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;

using Mono.XNA.Scene;
using FPS;

namespace Mono.XNA.Render
{
    public class Render
    {
        Color sceneColor;
        Camera camrea;

        public SpriteBatch SpriteBatch 
        {
            get { return spriteBatch; }
        }
        private SpriteBatch spriteBatch;

        public Render(Color sceneColor, Camera sceneCamera)
        {
            spriteBatch = SceneManager.SpriteBatch;
            this.sceneColor = sceneColor;
            this.camrea = sceneCamera;
        }

        /// <summary>
        /// Sprite描画
        /// </summary>
        /// <param name="texture">描画するテクスチャ</param>
        /// <param name="position">描画する2D座標</param>
        /// <param name="color">Sceneのアルファ値</param>
        public void DrawSprite(Texture2D texture, Vector2 position)
        {
            spriteBatch.Draw(texture, position, sceneColor);
        }

        /// <summary>
        /// モデルを描画
        /// </summary>
        /// <param name="model">描画するモデル</param>
        public void DrawMesh(Model model)
        {
            foreach (var mesh in model.Meshes)
            {
                SetMatrix(mesh);
                mesh.Draw();
            }
        }

        /// <summary>
        /// モデルを描画
        /// </summary>
        /// <param name="model"></param>
        public void DrawMesh(ModelAnimation model)
        {
            model.Set();
            foreach (var mesh in model.Model.Meshes)
            {
                SetMatrix(mesh);
                mesh.Draw();
            }
        }

        /// <summary>
        /// モデルをデフォルトの設定で読み込み、初期化を行う
        /// </summary>
        /// <param name="fileName">アセット名</param>
        /// <returns>読み込まれたモデルデータ</returns>
        public Model LoadModelDefault(string fileName)
        {
            Model model = SceneManager.Content.Load<Model>(fileName);

            foreach (ModelMesh mesh in model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    // デフォルトのライト適用
                    effect.EnableDefaultLighting();

                    // ビューマトリックスをあらかじめ設定 ((9, 9, 9) から原点を見る)
                    effect.View = this.camrea.ViewMatrix;


                    // プロジェクションマトリックスをあらかじめ設定
                    effect.Projection = this.camrea.ProjectionMatrix;
                }
            }
            return model;
        }

        public void SetMatrix(ModelMesh mesh)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                // ビューマトリックスをあらかじめ設定 ((9, 9, 9) から原点を見る)
                effect.View = this.camrea.ViewMatrix;

                // プロジェクションマトリックスをあらかじめ設定
                effect.Projection = this.camrea.ProjectionMatrix;
                
            }
        }
    }
}
